package reflect;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Scanner;

/**
 * java的反射机制
 * 反射是java的动态机制，允许程序在【运行期间】再确定如对象实例化，方法调用
 * 属性操作等。可以提高代码的灵活度，有良好的可扩展性，但是带来了较低的运行
 * 效率和较多的资源开销。适度使用。
 */
public class ReflectDemo1 {
    public static void main(String[] args) throws ClassNotFoundException {
        /*
            反射的第一步，获取要操作的类的类对象
            java.lang.Class 类对象
            它的每一个实例用于表示一个被JVM加载的类。
            意味着JVM每加载一个类(读取对应类的.class文件)的同时会实例化
            一个Class实例与之绑定，并在该Class实例上记录加载的类的一切信息
            因此每个被加载的类都有且只有一个Class的实例与之对应，通过这个
            类对象就可以了解其表示的类的所有信息

            获取一个类对象的方式
            1.通过类名.class
               Class cls = String.class;//获取String的类对象
               Class cls2 = int.class;//基本类型也可以获取类对象

            2.Class.forName(String className)
              Class cls3 = Class.forName("java.lang.String");

            3.类加载器ClassLoader
            4.对象.getClass()
         */

        //获取String的类对象
//        Class cls = String.class;
//        Class cls = ArrayList.class;

        //通过指定类的完全限定名获取一个类的类对象
//        Class cls = Class.forName("java.lang.String");
//        Class cls = Class.forName("java.util.ArrayList");
        /*
            java.lang.String
            java.util.ArrayList
            java.util.HashMap
            java.io.FileInputStream
         */
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入一个类名:");
        String name = scanner.nextLine();
        Class cls = Class.forName(name);


        //获取类对象表示的类的完全限定名
        String className = cls.getName();
        System.out.println(className);
        //仅获取类名
        className = cls.getSimpleName();
        System.out.println(className);
        /*
            Class的每一个实例用于表示一个类
            Package是反射对象之一，它的每一个实例仅表示一个包
         */
        Package pack = cls.getPackage();
        String packName = pack.getName();
        System.out.println("包名:"+packName);
        /*
            Method类，反射对象之一，它的每一个实例用于表示一个方法
         */
        Method[] methods = cls.getMethods();
        System.out.println("一共"+methods.length+"个方法");
        for (Method method : methods){
            System.out.println(method.getName());
        }


    }
}




